package controller

import (
	bc "Agricultural/application/blockchain"
	"Agricultural/application/lib"
	"Agricultural/application/util"
	"bytes"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

// 创建企业（注册）
func CreateCompany(ctx *gin.Context)  {
	// 解析结构体
	req := new(lib.Company)
	if err := ctx.ShouldBind(req); err != nil {
		_ = ctx.AbortWithError(http.StatusBadRequest, err)
		return
	}
	req.Id = util.Krand(11, 0)
	fmt.Println(req.Id)
	marshal, _ := json.Marshal(req)
	resp, err := bc.ChannelExecute("createCompany", [][]byte{
		marshal,
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

// 修改企业
func UpdateCompany(ctx *gin.Context)  {
	// 解析结构体
	req := new(lib.Company)
	if err := ctx.ShouldBind(req); err != nil {
		_ = ctx.AbortWithError(http.StatusBadRequest, err)
		return
	}
	marshal, _ := json.Marshal(req)
	resp, err := bc.ChannelExecute("updateCompany", [][]byte{
		marshal,
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

// 企业创建子账户交由农户管理
func CreateSubAccount(ctx *gin.Context)  {
	// 解析结构体
	req := new(lib.SubAccount)
	if err := ctx.ShouldBind(req); err != nil {
		_ = ctx.AbortWithError(http.StatusBadRequest, err)
		return
	}
	req.Id = util.Krand(11, 0)
	marshal, _ := json.Marshal(req)
	resp, err := bc.ChannelExecute("createSubAccount", [][]byte{
		marshal,
		[]byte(req.Subjection),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

// 企业修改子账户交由农户管理
func UpdateSubAccount(ctx *gin.Context)  {
	companyId := ctx.Query("companyId")
	// 解析结构体
	req := new(lib.SubAccount)
	if err := ctx.ShouldBind(req); err != nil {
		_ = ctx.AbortWithError(http.StatusBadRequest, err)
		return
	}
	marshal, _ := json.Marshal(req)
	resp, err := bc.ChannelExecute("updateSubAccount", [][]byte{
		marshal,
		[]byte(companyId),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

// 删除公司
func DelCompany(ctx *gin.Context)  {
	companyId := ctx.Query("companyId")
	resp, err := bc.ChannelExecute("delCompany", [][]byte{
		[]byte(companyId),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

// 公司删除旗下的子账户
func DelSubAccount(ctx *gin.Context)  {
	subId := ctx.Query("subId")
	companyId := ctx.Query("companyId")
	resp, err := bc.ChannelExecute("delSubAccount", [][]byte{
		[]byte(subId),
		[]byte(companyId),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.JSON(http.StatusOK, resp)
}

// 查询公司
func QueryCompany(ctx *gin.Context)  {
	companyId := ctx.Query("companyId")
	resp, err := bc.ChannelQuery("queryCompany", [][]byte{
		[]byte(companyId),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.String(http.StatusOK, bytes.NewBuffer(resp.Payload).String())
}

func QueryAllCompany(ctx *gin.Context)  {
	resp, err := bc.ChannelQuery("queryAllCompany", [][]byte{

	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.String(http.StatusOK, bytes.NewBuffer(resp.Payload).String())
}


// 查询子账户
func QuerySubAccount(ctx *gin.Context)  {
	subId := ctx.Query("subId")
	//companyId := ctx.Query("companyId")
	resp, err := bc.ChannelQuery("querySubAccount", [][]byte{
		[]byte(subId),
		//[]byte(companyId),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.String(http.StatusOK, bytes.NewBuffer(resp.Payload).String())
}

//查询公司旗下的所有子账户
func QuerySubAccounts(ctx *gin.Context)  {
	companyId := ctx.Query("companyId")
	resp, err := bc.ChannelQuery("querySubAccounts", [][]byte{
		[]byte(companyId),
	})
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		ctx.String(http.StatusInternalServerError, err.Error())
		return
	}
	ctx.String(http.StatusOK, bytes.NewBuffer(resp.Payload).String())
}